// 一般我们在开发的时候不太使用
// 因为很多东西都可以是变量
let a: object
a = {}
a = function () { }


// 那我们又怎么去约定对象呢
// 一般去指定属性
let b: { name: string }
b = { name: '孙悟空' }

let c: { name: string, age: number }
c = { name: '孙悟空', age: 18 }

// 那如果我们有的时候指向定义一个变量呢
// 以下示例表示 可选属性 加上一个?
let d: { name: string, age?: number }
d = { name: '孙悟空' }

// 如果我们只定义了一个属性
// 却想定义变量时包含多个属性 那该怎么办呢

// propName写什么都行 string是给propName属性名的限制 并不是值

let e: { name: string, [propName: string]: any }
e = { name: '猪八戒', age: 18, gender: "男" }


// 利用箭头函数 来设置函数结构的类型声明
let f: (a: number, b: number) => number
f = function (n1: number, n2: number): number {
    return n1 + n2
}


// 表示字符串数组
let g: string[]
g = ['a', 'b', 'c']

let h: Array<number>
h = [1, 2, 3, 4]

let i: any[]
i = [1, 'hello']


// 元组就是固定长度的数组
let j: [string, string]
j = ['hello', 'world']


// enum 枚举
enum Gender {
    Male = 0,
    Female = 1
}
let k: { name: string, gender: Gender }
k = {
    name: '孙悟空',
    gender: Gender.Male
}
k.gender === Gender.Male


// &表示就l对象 既要有name 又要有age
let l: { name: string } & { age: number }
l = { name: '孙悟空', age: 20 }


// 类型的别名
type myType = 1 | 2 | 3 | 4 | 5 | 6
type myType2 = 2 | 3 | 4 | 5 | 6 | 7
// let m: 1 | 2 | 3 | 4 | 5 | 6
let m: myType
// let n: 2 | 3 | 4 | 5 | 6 | 7
let n: myType2